package com.xinnet.mms.allot.service;

import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;

import com.xinnet.mms.entity.CustomAllotConfig;
import com.xinnet.mms.entity.Customer;
import com.xinnet.mms.entity.CustomerCare;
import com.xinnet.mms.entity.Dept;
import com.xinnet.mms.entity.Emp;
import com.xinnet.mms.entity.Product;
import com.xinnet.mms.entity.PushHistory;
import com.xinnet.mms.entity.ScanningList;

@Service
public interface CustomAllotService {
	/**
	 * 
	 * 功能描述： 单个客户实时分配
	 *
	 * @param customer
	 * @param customerType	
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void allot(Customer customer,int customerType) throws Exception;

	/**
	 * 
	 * 功能描述：根据客户地域标签和产品标签 得到对应的部门
	 *
	 * @param customer
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Dept getDept(Customer customer) throws SQLException;

//	/**
//	 * 
//	 * 功能描述：用取得的部门编号获取该部门将要被分配的员工编号
//	 *
//	 * @param deptno
//	 * @return
//	 * @throws SQLException
//	 *
//	 * @author 王湛智[wangzhanzhi@xinnet.com]
//	 *
//	 * @since 2014年1月20日
//	 *
//	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
//	 */
//	public Emp getEmp(@Param(value = "deptno") String deptno) throws SQLException;

	/**
	 * 
	 * 功能描述：用取得的部门标识 得到负责的产品信息
	 *
	 * @param deptno
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Product getProductByDeptno(@Param(value = "deptno") String deptno) throws SQLException;

	/**
	 * 
	 * 功能描述：将报备信息与新注册客户信息匹配 若手机号和email匹配 两项一致返回真 否则假
	 *
	 * @param customer
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Customer checkReported(Customer customer) throws SQLException;

	/**
	 * 
	 * 功能描述：将被分配或被推送员工数据封装进流转表
	 *
	 * @param customer
	 * @param emp
	 * @param dept
	 * @param product
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public PushHistory packagePushHistory(Customer customer, Emp emp,Dept dept, Product product) throws SQLException;

//	/**
//	 * 
//	 * 功能描述：重置部门所有员工排座标记
//	 *
//	 * @param deptno
//	 * @throws SQLException
//	 *
//	 * @author 王湛智[wangzhanzhi@xinnet.com]
//	 *
//	 * @since 2014年1月20日
//	 *
//	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
//	 */
//	public void resetAllAllotLabel(@Param(value = "deptno") String deptno) throws SQLException;

	/**
	 * 
	 * 功能描述：通过人员标识查询人员信息
	 *
	 * @param empno
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Emp getEmpByEmpno(@Param(value = "empno") String empno) throws SQLException;
	
	/**
	 * 功能描述：通過分配状态查询
	 * @author 王志军
	 */
	public List<Customer> getRebateCustomer(Integer isAllot,String timeSet) throws SQLException;
	
	/**
	 * 
	 * 功能描述：通过人员所属部门标识查询部门信息
	 *
	 * @param deptno
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Dept getDeptByDeptno(@Param(value = "id") String deptno) throws SQLException;

//	/**
//	 * 
//	 * 功能描述：将该员工排座标记设为不可排座
//	 *
//	 * @param empno
//	 * @throws SQLException
//	 *
//	 * @author 王湛智[wangzhanzhi@xinnet.com]
//	 *
//	 * @since 2014年1月20日
//	 *
//	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
//	 */
//	public void resetAllotLabel(@Param(value = "empno") String empno) throws SQLException;

	/**
	 * 
	 * 功能描述：增加流转数据
	 *
	 * @param pushHistory
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void addHistory(PushHistory pushHistory) throws SQLException;

	/**
	 * 
	 * 功能描述：获得报备客户信息匹配的客户数量
	 *
	 * @param customer
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public int getCheckReportedCount(Customer customer) throws SQLException;
	
	/**
	 * 
	 * 功能描述：将客户信息插入客户表
	 *
	 * @param customer
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public boolean addNewCustomer(Customer customer) throws SQLException;
	
	/**
	 * 
	 * 功能描述：修改客戶類型為意向客戶
	 *
	 * @param cusId
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void updateCustomerType(@Param(value="cusId") String cusId) throws SQLException;
	
	/**
	 * 
	 * 功能描述：用会员编号查询该会员的订单集
	 *
	 * @param cusId
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public List<CustomerCare> getOrdersByCusId(@Param(value="cusId") String cusId) throws SQLException;
	
	/**
	 * 
	 * 功能描述：修改客户类型为服务期客户
	 *
	 * @param cusId
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void updateCustomerTypetoService(@Param(value="cusId") String cusId) throws SQLException;
		
	/**
	 * 
	 * 功能描述：将客户服务信息放入客户服务表
	 *
	 * @param customerCare
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void addCustomerService(CustomerCare customerCare) throws SQLException;
	
	/**
	 * 
	 * 功能描述：通过客户ID获取客户信息
	 *
	 * @param cusId
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Customer getCustomerById(@Param(value="cusId") String cusId) throws SQLException;
	
	/**
	 * 
	 * 功能描述：通过用户ID查询客户被分配状态
	 *
	 * @param cusId
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年1月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public boolean getCustomerState(String cusId,String empno,String productCode) throws SQLException;
	/**
	 * 
	 * 功能描述：处理调配客户
	 *
	 * @param customer
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月20日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void doMixCoustomer(Customer customer) throws Exception;
	/**
	 * 
	 * 功能描述：用会员编号查询该会员购物车内的商品
	 *
	 * @param cusId
	 * @return
	 * @throws Exception
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月24日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public String getShoppingCartByCusId(String cusId) throws Exception;
	/**
	 * 
	 * 功能描述：用产品标签查出产品
	 *
	 * @param productId
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月24日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Product getProductByProductId(String productId) throws SQLException;
	/**
	 * 
	 * 功能描述：获取默认分配的产品线
	 *
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月24日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Product getDefaultProduct() throws SQLException;
	/**
	 * 
	 * 功能描述：获取流量跟踪接口的产品意向
	 *
	 * @param cusId
	 * @return
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月24日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public String getProductLabelFromDubbo(String cusId);
	/**
	 * 
	 * 功能描述：根据ID删除客户
	 *
	 * @param cusId
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月26日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void delCustomer(String cusId) throws SQLException;
	/**
	 * 
	 * 功能描述：给出多个产品ID 得到优先级最高的产品
	 *
	 * @param productIds
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月26日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public String getAllotProductMaxPriority(String[] productIds) throws Exception;
	/**
	 * 
	 * 功能描述：取得父节点部门
	 *
	 * @param deptno
	 * @return
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月27日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public Dept getParentDept(String deptno) throws SQLException;
	/**
	 * 
	 * 功能描述：修改人员客户关系
	 *
	 * @param empCustomer
	 * @throws SQLException
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年3月28日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void updateEmpAndCustomer(Customer customer) throws SQLException;
	
	/**
	 * 
	 * 功能描述：修改客户分配状态
	 *
	 * @param empCustomer
	 * @throws SQLException
	 *
	 * @author 王志军[wangzhijun@xinnet.com]
	 *
	 * @since 2014年3月28日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public void updateCustomerIsAllot(Customer customer) throws SQLException;
	/**
	 * 
	 * 方法说明:根据商品code获取商品类型
	 *
	 * @author 王湛智 [wangzhanzhi1@xinnet.com]
	 *
	 * @since 2014年4月17日 上午10:53:31
	 *
	 * @return String
	 *
	 */
	public String getGoodsTypeByGoodsCode(String goodsCode);
	/**
	 * 
	 * 功能描述：处理400乐语客户
	 *
	 * @param customer
	 * @return
	 * @throws Exception
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年4月24日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public boolean doNotRegisterNewCustomer(Customer customer) throws Exception;
	/**
	 * 
	 * 
	 * 功能描述：用客户ID和销售ID找出超时的推送记录并删除
	 *
	 * @author 王湛智[wangzhanzhi@xinnet.com]
	 *
	 * @since 2014年5月6日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 *
	 */
	public void delPushHistoryByCusIdAndEmpno(Customer customer,Emp emp)  throws Exception;
	/**
	 * 
	 * 功能描述：修改客户产品标签
	 * 
	 * @author 王湛智
	 * 
	 * @param cusId
	 * @throws SQLException
	 */
	public void updateCustomerLabel(String cusId,String productId) throws SQLException;
	/**
	 * 
	 * 功能描述：通过productCode获取product
	 * 
	 * @author 王湛智
	 * 
	 * @param prodcutCode
	 * @return
	 * @throws SQLException
	 */
	public Product getProductByProductCode(String prodcutCode) throws SQLException;
	/**
	 * 
	 * 功能描述：查询支持人工推送的emp
	 * 
	 * @author 王湛智
	 * 
	 * @param deptno
	 * @return
	 * @throws SQLException
	 */
	public Emp getEmpsByDeptnoIsArtifical(String deptno) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：处理400乐语客户匹配
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月13日
	 *
	 */
	public boolean do400Customer(Customer customer,Customer tempCustomer) throws Exception;
	/**
	 * 
	 *
	 * 功能描述：根据手机邮箱获取400乐语客户
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月13日
	 *
	 */
	public Customer get400Customer(Customer customer) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：修改客户信息
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月13日
	 *
	 */
	public void updateCustomerInfo(Customer customer) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：根据cusId和productLabel查询客户表记录数
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月18日
	 *
	 */
	public Integer getServiceCustomerCountByCusIdAndProductLabel(Customer customer) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：处理电销客户分配
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月23日
	 *
	 */
	public boolean doDomainCustomer(String productCode,Customer customer,Integer customerType) throws Exception;
	/**
	 * 
	 *
	 * 功能描述：获取相同手机号/邮箱的客户
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年6月24日
	 *
	 */
	public Customer getCheckAlikeCustomer(Customer customer) throws Exception;
	
	/**
	 * 
	 *
	 * 功能描述：获取相同手机号/邮箱的客户
	 * 
	 * @author 王志军
	 *
	 * @throws 2016年5月9日
	 *
	 */
	public Customer getCheckCustomerByPhone(Customer customer) throws Exception;
	
	/**
	 * 
	 *
	 * 功能描述：验证Customer的产品标签
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年7月1日
	 *
	 */
	public Customer checkProduct(Customer customer) throws Exception;
	/**
	 * 
	 *
	 * 功能描述：修改扫描表记录
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年7月3日
	 *
	 */
	public void updateScanningListById(ScanningList scann) throws SQLException;
	
	
	/**
	 * 
	 *
	 * 功能描述：处理未接收客户任务
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年7月10日
	 *
	 */
	public void handleScaningList(ScanningList scann) throws Exception;
	
	
	public List<ScanningList> getAllScanningList()throws SQLException;
	
	public int getScanningCountByEmpno(String empno) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：重置该部门超时重新分配标签
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public void resetScannAllAllotLabel(String deptno,Integer customerType) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：获取可以被超时分配的员工
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public Emp getScannEmp(String deptno,Integer customerType) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：将员工超时未接收标签设为不可接收
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public void resetScannAllotLabel(String empno,Integer customerType) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：重置该部门重新分配标签
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public void resetAllAllotLabel(String deptno,Integer customerType) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：获取可以被分配的员工
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public Emp getEmp(String deptno,Integer customerType) throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：将员工接收标签设为不可接收
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public void resetAllotLabel(String empno,Integer customerType) throws SQLException;
	
	/**
	 * 
	 *
	 * 功能描述：获取要清洗的数据
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月13日
	 *
	 */
	public List<Customer> getFlushDataCustomer() throws SQLException;
	/**
	 * 
	 *
	 * 功能描述：标记电销销售分配标签
	 * 
	 * @author 湛智
	 *
	 * @throws 2014年8月22日
	 *
	 */
	public void resetSpecialEmpAllotLabel(String empno) throws SQLException;
	
	/**
	 * 获取系统分配超时流走时间
	 * @return CustomAllotConfig
	 * @throws SQLException
	 */
	public CustomAllotConfig getPollInterval() throws SQLException;
	
	/**
	 * 设置系统分配超时流走时间
	 * @param pollInterval
	 * @return
	 * @throws SQLException
	 */
	public void updatePollInterval(Integer pollInterval) throws SQLException;
}
